home *** CD-ROM | disk | FTP | other *** search
- ⓪ MODULE LANMonitor; (*$H+,Z+,R-*)⓪ ⓪ (*⓪ NOTES⓪ -----⓪ - Testen auch ohne Interrupts - nur Polling!⓪ - Die CRC-Prüfung scheint nicht zu klappen. Zumindest wird kein Fehler angezeigt,⓪"wenn beim empf. Dataframe das 1.Byte fehlt.⓪"-> Evtl. wird overrun gelmeldet und nicht erkannt?⓪ - Wenn 'excessCollsns' gemeldet wird, kann das auch heißen, daß⓪"der Partner überhaupt nicht geantwortet hat (also kein CTS auf's RTS⓪"gesandt hat).⓪ - oft passiert es, daß das CTS zu spät kommt. Dann wird in 'GetFrame'⓪"'fAdrInUse' gesetzt, weil man annimmt, daß jemand anderes auf ein RTS⓪"geantwortet hat (denn 'fCTSexpected ist schon FALSE).⓪"Das ist eigentlich OK, nur daß das *erwartete* CTS offenbar dann zu spät kam.⓪ - seltsamerweise klappt beim TransmitPacket immer der erste RTS nicht.⓪"Es kommt dann kein CTS? Bei weiteren RTS klappt's dafür immer.⓪ *)⓪ ⓪ (*⓪ IMPORT TOSDebug;⓪ *)⓪ ⓪ IMPORT TOSIO; (*$E MOS *)⓪ ⓪ IMPORT SYSTEM;⓪ FROM SYSTEM IMPORT ASSEMBLER, ADR, BYTE;⓪ ⓪ IMPORT ALAP;⓪ ⓪ IMPORT MOSGlobals, PrgCtrl;⓪ ⓪ FROM InOut IMPORT WriteLn, Write, WriteCard, ReadCard, ReadLCard, Read,⓪0GotoXY, WritePg, WriteString, WriteHex, WriteLHex,⓪0KeyPressed, Done, WriteNum, WriteLNum;⓪ ⓪ FROM GEMDOS IMPORT Super;⓪ IMPORT VT52; FROM VT52 IMPORT Codes;⓪ ⓪ ⓪ CONST NMI_Mask = $0700; (* !!! $0700 *)⓪ ⓪ ⓪ (*****************************************************************************)⓪ ⓪ ⓪ MODULE SCC;⓪ (*$L-*)⓪ ⓪ FROM SYSTEM IMPORT WORD, ADDRESS, ASSEMBLER;⓪ ⓪ IMPORT Super;⓪ FROM PrgCtrl IMPORT TermCarrier, CatchProcessTerm;⓪ FROM MOSGlobals IMPORT MemArea;⓪ ⓪ EXPORT QUALIFIED Reg, SetReg, CTLA;⓪ ⓪ CONST CTLA = $FFFF8C81;⓪ ⓪ PROCEDURE Reg (n: CARDINAL): CARDINAL;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE SR,-(A7)⓪(MOVE #$2500,SR⓪(MOVEA.W #CTLA,A1⓪(MOVE.W -(A3),D0⓪(BEQ read0⓪(MOVE.B D0,(A1) ; SCC A control⓪&read0:⓪(MOVE.B (A1),D0⓪(MOVE (A7)+,SR⓪$END;⓪"END Reg;⓪ ⓪ PROCEDURE SetReg (no, value: CARDINAL);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE SR,-(A7)⓪(MOVE #$2500,SR⓪(MOVEA.W #CTLA,A1⓪(MOVE.W -(A3),D1 ; value⓪(MOVE.W -(A3),D0 ; no⓪(BEQ write0⓪(MOVE.B D0,(A1) ; SCC A control⓪&write0:⓪(MOVE.B D1,(A1)⓪(MOVE (A7)+,SR⓪$END;⓪"END SetReg;⓪ ⓪ (*$L=*)⓪ ⓪ (****** Vorsicht: ab hier $L+ ******)⓪ ⓪ PROCEDURE term;⓪"VAR ssp: LONGCARD;⓪"BEGIN⓪$ssp:= Super (0);⓪$SetReg (9, $C0);⓪$ssp:= Super (ssp)⓪"END term;⓪ ⓪ VAR carrier: TermCarrier;⓪ ⓪ BEGIN⓪"CatchProcessTerm (carrier, term, MemArea{NIL,0});⓪ END (* MODULE *) SCC;⓪ ⓪ ⓪ TYPE BS = SET OF [0..7];⓪%RegSet = SET OF [0..15];⓪ ⓪ CONST ReadRegs = RegSet {0,1,2,3,8,10,12,13,15};⓪&WriteRegs = RegSet {0..15};⓪&⓪&RegsToDisplay = RegSet {0,1,2,3,8,10,12,13,15};⓪&⓪ ⓪ PROCEDURE WriteReg (n: CARDINAL);⓪"VAR reg: CARDINAL;⓪"BEGIN⓪$reg:= SCC.Reg (n);⓪$WriteNum (reg, 16, 2, '0');⓪$WriteString (' ');⓪$WriteNum (reg, 2, 8, '0');⓪"END WriteReg;⓪ ⓪ ⓪ VAR ch: CHAR;⓪$rxIdx, n, c: CARDINAL;⓪$lc: LONGCARD;⓪$i: INTEGER;⓪$ssp, li: LONGINT;⓪$redraw, quit, ok, b: BOOLEAN;⓪$by: BS;⓪$myaddr, outaddr: CARDINAL;⓪$sentDatas,sendTrials,rcvdDatas: LONGCARD;⓪$⓪$txFrame: ALAP.aTxFrame;⓪$packet: ALAP.ptrPacket;⓪$dstParam, srcParam: ALAP.anAddress;⓪$typeParam: ALAP.aLAPtype;⓪$dataParam: ALAP.aDataField;⓪$txStatus: ALAP.TransmitStatus;⓪$frameStatus: ALAP.FrameStatus;⓪$dataLength: INTEGER;⓪ ⓪ BEGIN⓪"WritePg;⓪"ssp:= Super (0);⓪"⓪"(*⓪"WriteLn;⓪"WriteString ('Start...');⓪"FOR c:= 1 TO 5 DO⓪$FOR n:= 1 TO 5*1000 DO⓪&ASSEMBLER⓪(MOVEA.W #$FA00,A2⓪(MOVEQ #50,D0⓪(MOVE.B #$DF,$0B(A2) ; IPRA: Clear Timer-A Pending Bit⓪(MOVE.B D0,$1F(A2) ; TADR: Set Timer Count⓪(MOVE.B #2,$19(A2) ; TACR: Timer Start (Teiler: 1/10)⓪$l0: BTST #5,$0B(A2) ; time over?⓪(BEQ l0⓪(MOVE.B #$00,$19(A2) ; TACR: Timer Stop⓪&END;⓪$END;⓪"END;⓪"WriteString ('Stop!');⓪"WriteLn;⓪"*)⓪"⓪"WriteLn;⓪"WriteString ('Init...');⓪"WriteLn;⓪"⓪"ASSEMBLER⓪(MOVEQ #0,D0⓪(JSR ALAP.Init;⓪"END;⓪"⓪"ALAP.NewPacketBuffer;⓪"ALAP.NewPacketBuffer;⓪"ALAP.NewPacketBuffer;⓪"ALAP.NewPacketBuffer;⓪"⓪"WriteString ('OK');⓪"WriteLn;⓪"⓪"rxIdx:= 0;⓪"redraw:= TRUE;⓪"quit:= FALSE;⓪"REPEAT⓪$IF redraw THEN⓪&GotoXY (4,0);⓪&WriteString (' interrupts');⓪&GotoXY (4,1);⓪&WriteString (' frames received');⓪&GotoXY (0,2);⓪&FOR n:= 0 TO 15 DO⓪(IF n IN ReadRegs THEN⓪*WriteString ('Reg '); WriteNum (n, 16, 1, '0'); WriteString (': '); WriteLn;⓪(END⓪&END;⓪&WriteString (VT52.Seq[clearEOS]);⓪&⓪&c:= 2;⓪&FOR n:= 0 TO 15 DO⓪(IF n IN ReadRegs THEN⓪*IF n IN RegsToDisplay THEN GotoXY (7,c); WriteReg (n) END;⓪*INC (c);⓪(END;⓪&END;⓪&⓪&GotoXY (0, 11);⓪&WriteString ('myAddress: '); WriteHex (LONG (ALAP.myAddress), 3);⓪&WriteString (', dest-Addr: '); WriteHex (outaddr, 3);⓪&GotoXY (0, 12);⓪&WriteString ('collsns: , defers:');⓪&GotoXY (0, 13);⓪&WriteString ('RTS: , CTS: , Data:');⓪&redraw:= FALSE⓪$END;⓪$GotoXY (0,0);⓪$WriteCard (ALAP.Interrupts, 4);⓪$GotoXY (0,1);⓪$WriteCard (ALAP.FramesReceived, 4);⓪$GotoXY (8,12);⓪$WriteCard (ALAP.collsnCount,3);⓪$GotoXY (20,12);⓪$WriteCard (ALAP.deferCount,3);⓪$GotoXY (4,13);⓪$WriteCard (ALAP.RTSFramesOut,3);⓪$GotoXY (13,13);⓪$WriteCard (ALAP.CTSFramesOut,3);⓪$GotoXY (23,13);⓪$WriteCard (ALAP.DataFramesOut,3);⓪$⓪$ASSEMBLER MOVE SR,-(A7) ORI.W #$0700,SR END;⓪$IF ALAP.headPacket # ALAP.tailPacket THEN⓪&frameStatus:= ALAP.ReceiveFrame (packet);⓪&GotoXY (40, rxIdx);⓪&WriteCard (rxIdx, 2);⓪&INC (rxIdx);⓪&WriteString (': ');⓪&ALAP.WriteFrame (packet^, 5);⓪&WriteCard (packet^.no, 1); Write (' ');⓪&ALAP.WriteStatus (packet^.status);⓪$END;⓪$ASSEMBLER MOVE.W (A7)+,SR END;⓪$⓪$IF KeyPressed() THEN⓪&GotoXY (0,14);⓪&WriteString (VT52.Seq[clearEOS]);⓪&WriteLn;⓪&Read (ch); ch:= CAP (ch);⓪&IF ch = 'Q' THEN⓪(quit:= TRUE;⓪&ELSIF ch = 'T' THEN⓪(WriteLn;⓪(WriteString ('Transmitting...');⓪(WriteLn;⓪(⓪((*txStatus:= ALAP.TransmitPacket (outaddr, BYTE($10), dataParam, 0);*)⓪(WITH txFrame DO⓪*ctrl.srcAddr:= ALAP.myAddress;⓪*ctrl.dstAddr:= SHORT (outaddr);⓪*ctrl.lapType:= BYTE ($10);⓪*dataCnt1:= 2;⓪*dataPtr1:= ADR (dataParam);⓪*dataCnt2:= 0;⓪*dataParam[1]:= BYTE ($12);⓪*dataParam[2]:= BYTE ($34);⓪(END;⓪(ASSEMBLER⓪*LEA txFrame,A0⓪*JSR ALAP.TransmitPacket⓪*MOVE D0,txStatus⓪(END;⓪(⓪(ALAP.fAdrInUse:= FALSE;⓪(WriteString ('Status: ');⓪(CASE txStatus OF⓪(| ALAP.transmitOK: WriteString ('transmitOK')⓪(| ALAP.excessDefers: WriteString ('excessDefers')⓪(| ALAP.excessCollsns: WriteString ('excessCollsns')⓪(| ALAP.dupAddress: WriteString ('dupAddress')⓪(END;⓪(WriteLn;⓪&ELSIF ch = 'R' THEN⓪(WriteLn;⓪(WriteString ('Receiving...');⓪(WriteLn;⓪(ALAP.ReceivePacket (dstParam, srcParam, typeParam, dataParam, dataLength);⓪(IF KeyPressed () THEN⓪*WriteString ('Aborted');⓪*Read (ch)⓪(ELSE⓪*WriteString ('OK');⓪(END⓪&ELSIF ch = 'G' THEN⓪(WriteLn;⓪(WriteString ('Getting Addresses on Bus...');⓪(WriteLn;⓪(FOR n:= $01 TO $7F DO⓪*⓪*(*txStatus:= ALAP.TransmitPacket (SHORT(n), BYTE($81), dataParam, 0);*)⓪*WITH txFrame DO⓪,ctrl.srcAddr:= ALAP.myAddress;⓪,ctrl.dstAddr:= SHORT (n);⓪,ctrl.lapType:= ALAP.lapENQ;⓪,dataCnt1:= 0;⓪,dataCnt2:= 0;⓪*END;⓪*ASSEMBLER⓪,LEA txFrame,A0⓪,JSR ALAP.TransmitPacket⓪,MOVE D0,txStatus⓪*END;⓪*⓪*IF txStatus = ALAP.dupAddress THEN⓪,Write ('>'); WriteHex (n, 3); Write ('<'); WriteLn;⓪*END;⓪*ALAP.fAdrInUse:= FALSE;⓪(END;⓪(WriteLn;⓪(WriteString ('OK.');⓪(WriteLn;⓪&ELSIF ch = ' ' THEN⓪(WritePg;⓪(rxIdx:= 0;⓪(redraw:= TRUE⓪&ELSIF ch = 'I' THEN⓪(WriteString ('Address? ');⓪(ReadCard (myaddr);⓪(IF Done THEN⓪*ASSEMBLER⓪,MOVE myaddr,D0⓪,JSR ALAP.Init⓪*END⓪(END⓪&ELSIF ch = 'A' THEN⓪(WriteString ('Dest-Address? ');⓪(ReadCard (outaddr);⓪&ELSIF ch = '0' THEN⓪((*⓪*Test-Modus.⓪*sieht NUR mit Polling nach, ob Daten angekommen sind.⓪(*)⓪(rcvdDatas:= 0;⓪(ASSEMBLER MOVE SR,-(A7) ORI.W #$0500,SR END;⓪(LOOP⓪*frameStatus:= ALAP.ReceiveFrame (packet);⓪*IF frameStatus = ALAP.lapDATAframe THEN⓪,(*⓪.WriteHex (LONG(packet^.frame.srcAddr),3);⓪,*)⓪,IF packet^.frame.lapType = BYTE ($11) THEN EXIT END;⓪,INC (rcvdDatas);⓪*END;⓪(END;⓪(ASSEMBLER MOVE.W (A7)+,SR END;⓪(WriteLn;⓪(WriteCard (rcvdDatas,0); WriteString (' frames received');⓪(Read (ch);⓪&ELSIF ch = '1' THEN⓪((*⓪*Test-Modus.⓪*sieht mit Polling nach, ob Daten angekommen sind.⓪(*)⓪(rcvdDatas:= 0;⓪(LOOP⓪*frameStatus:= ALAP.ReceiveFrame (packet);⓪*IF frameStatus = ALAP.lapDATAframe THEN⓪,IF packet^.frame.lapType = BYTE ($11) THEN EXIT END;⓪,INC (rcvdDatas);⓪,WriteHex (LONG(packet^.frame.srcAddr),3);⓪*END;⓪*IF KeyPressed() THEN EXIT END;⓪(END;⓪(WriteLn;⓪(WriteCard (rcvdDatas,0); WriteString (' frames received');⓪(Read (ch);⓪&ELSIF ch = '2' THEN⓪((*⓪*Test-Modus.⓪*sieht NUR im Interrupt nach, ob Daten angekommen sind.⓪(*)⓪(rcvdDatas:= 0;⓪(LOOP⓪*ASSEMBLER MOVE SR,-(A7) ORI.W #$0500,SR END;⓪*WHILE ALAP.headPacket # ALAP.tailPacket DO⓪,frameStatus:= ALAP.ReceiveFrame (packet);⓪,IF frameStatus = ALAP.lapDATAframe THEN⓪.IF packet^.frame.lapType = BYTE ($11) THEN⓪0ASSEMBLER MOVE.W (A7)+,SR END;⓪0EXIT⓪.END;⓪.INC (rcvdDatas);⓪.WriteHex (LONG(packet^.frame.srcAddr),3);⓪,END;⓪*END;⓪*ASSEMBLER MOVE.W (A7)+,SR END;⓪*IF KeyPressed() THEN EXIT END;⓪(END;⓪(WriteLn;⓪(WriteCard (rcvdDatas,0); WriteString (' frames received');⓪(Read (ch);⓪&ELSIF ch = '3' THEN⓪((*⓪*Test-Modus.⓪*Jede Station sendet ununterbrochen;⓪*sieht jedesmal nach, ob Daten angekommen sind.⓪(*)⓪(rcvdDatas:= 0;⓪(sentDatas:= 0;⓪(sendTrials:= 0;⓪(WITH txFrame DO⓪*ctrl.srcAddr:= ALAP.myAddress;⓪*ctrl.dstAddr:= SHORT (outaddr);⓪*ctrl.lapType:= BYTE ($10);⓪*dataCnt1:= 1024;⓪*dataPtr1:= ADR (dataParam);⓪*dataCnt2:= 0;⓪*dataParam[1]:= BYTE ($12);⓪*dataParam[2]:= BYTE ($34);⓪*dataParam[3]:= BYTE ($56);⓪(END;⓪(LOOP⓪*ASSEMBLER LEA txFrame,A0 JSR ALAP.TransmitPacket MOVE D0,txStatus END;⓪*INC (sendTrials);⓪*IF ALAP.fAdrInUse THEN Write ('#'); ALAP.fAdrInUse:= FALSE; END;⓪*CASE txStatus OF⓪*| ALAP.transmitOK: Write ('.'); INC (sentDatas)⓪*| ALAP.excessDefers: Write ('+')⓪*| ALAP.excessCollsns: Write ('-')⓪*| ALAP.dupAddress:⓪*END;⓪*ASSEMBLER MOVE SR,-(A7) ORI.W #$0500,SR END;⓪*WHILE ALAP.headPacket # ALAP.tailPacket DO⓪,frameStatus:= ALAP.ReceiveFrame (packet);⓪,IF frameStatus = ALAP.lapDATAframe THEN⓪.INC (rcvdDatas);⓪.WriteHex (LONG(packet^.frame.srcAddr),3);⓪.IF packet^.frame.lapType = BYTE ($11) THEN EXIT END;⓪,END;⓪*END;⓪*ASSEMBLER MOVE.W (A7)+,SR END;⓪*IF KeyPressed() THEN EXIT END;⓪(END;⓪(WriteLn;⓪(WriteCard (sendTrials,0); WriteString (' frames tried to sent, ');⓪(WriteCard (sentDatas,0); WriteString (' frames sent, ');⓪(WriteCard (rcvdDatas,0); WriteString (' frames received');⓪(Read (ch);⓪&ELSIF ch = '4' THEN⓪((*⓪*Send Abort to all (Broadcast)⓪(*)⓪(WITH txFrame DO⓪*ctrl.srcAddr:= ALAP.myAddress;⓪*ctrl.dstAddr:= BYTE ($FF);⓪*ctrl.lapType:= BYTE ($11);⓪*dataCnt1:= 0;⓪*dataCnt2:= 0;⓪(END;⓪(ASSEMBLER LEA txFrame,A0 JSR ALAP.TransmitPacket MOVE D0,txStatus END;⓪&(*⓪&ELSIF (ch >= '0') & (ch <= '9') OR (ch >= 'A') & (ch <= 'F') THEN⓪(Write (10C); (* BS *)⓪(n:= ORD (ch) - ORD ('0'); IF n > 9 THEN DEC (n, 7) END;⓪(IF n IN WriteRegs THEN⓪*WriteString ('Write Reg '); WriteNum (n, 16, 1, '0');⓪*WriteString ('? ');⓪*ReadCard (c);⓪*IF Done & (c <= 255) THEN⓪,SCC.SetReg (n, c);⓪*ELSE⓪,WriteString ('No write!'); WriteLn⓪*END⓪(END⓪&*)⓪&END;⓪$END;⓪"UNTIL quit;⓪"ssp:= Super (ssp)⓪ END LANMonitor.⓪ ə
- (* $FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$00000FA1$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0$FFF006F0Ç$000023E8T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00002159$000023A9$000023E8$000023A9$000020DF$00001815$00001C1C$00001C09$00002600$00002ACE$FFF006F0$00000417$000003A2$00001F4E$00001FCE$00002198öüé*)
-